#include<bits/stdc++.h>
using namespace std;
int n,m,l,v;
struct node{
    int d,s,a;
}info[100005];
int pla[100005];
bool dp[25][25],flag[25],fff[25];
bool commm(int xd,int xs,int xa,int plla){
    if(v*v-xs*xs<2*xa*(plla-xd)){
        return true;
    }
    return false;
}
bool check(int sum1){
    memset(fff,0,sizeof(fff));
    int numm=0;
    for(int i=1;i<=m;i++){
        if(flag[i]==true){
            for(int j=1;j<=n;j++){
                if(dp[j][i]==true&&fff[j]==false){
                    fff[j]=true;
                    numm++;
                }
            }
        }
    }
    if(numm==sum1){
        return true;
    }
    return false;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int ttt,sum1,sum2;
    bool flag1;
    scanf("%d",&ttt);
    for(int tttt=1;tttt<=ttt;tttt++){
        scanf("%d%d%d%d",&n,&m,&l,&v);
        flag1=false;
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&info[i].d,&info[i].s,&info[i].a);
            if(info[i].a<0){
                flag1=true;
            }
        }
        for(int i=1;i<=m;i++){
            scanf("%d",&pla[i]);
        }
        if(flag1==false){
            sum1=0;
            for(int i=1;i<=n;i++){
                if(info[i].d>pla[m]){
                    continue;
                }
                if(info[i].a==0){
                    if(info[i].s>v){
                        sum1++;
                    }
                }
                else{
                    if(commm(info[i].d,info[i].s,info[i].a,pla[m])){
                        sum1++;
                    }
                }
            }
            printf("%d ",sum1);
            if(sum1==0){
                printf("%d\n",m);
            }
            else{
                printf("%d\n",m-1);
            }
        }
        else{
            sum1=0;
            bool flag2;
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++){
                flag2=false;
                if(info[i].d>pla[m]){
                    continue;
                }
                if(info[i].a==0){
                    if(info[i].s>v){
                        for(int j=1;j<=m;j++){
                            if(pla[j]>=info[i].d){
                                dp[i][j]=true;
                            }
                        }
                        flag2=true;
                    }
                }
                else if(info[i].a>0){
                    for(int j=1;j<=m;j++){
                        if(dp[i][j-1]==true){
                            dp[i][j]=true;
                        }
                        else if(commm(info[i].d,info[i].s,info[i].a,pla[j])){
                            dp[i][j]=true;
                            flag2=true;
                        }
                    }
                }
                else{
                    if(info[i].s>v){
                        for(int j=1;j<=m;j++){
                            if(info[i].d>pla[j]){
                                continue;
                            }
                            if(commm(info[i].d,info[i].s,info[i].a,pla[j])){
                                dp[i][j]=true;
                                flag2=true;
                            }
                        }
                    }
                }
                if(flag2==true){
                    sum1++;
                }
            }
            printf("%d ",sum1);
            sum2=100000;
            int now=0;
            memset(flag,0,sizeof(flag));
            for(int i=1;i<=pow(2,m);i++){
                int j=1;
                while(flag[j]==true){
                    flag[j]=false;
                    j++;
                    now--;
                }
                flag[j]=true;
                now++;
                if(check(sum1)){
                    sum2=min(sum2,now);
                }
            }
            printf("%d\n",m-sum2);
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
